/**
 * @program: LeetCode
 * @description: LeetCode : 72. 编辑距离
 * @author: WXY
 * @create: 2023-01-30 16:18
 * @Version 1.0
 *
 * 给你两个单词 word1 和 word2， 请返回将 word1 转换成 word2 所使用的最少操作数  。
 * 你可以对一个单词进行如下三种操作：
 *     插入一个字符
 *     删除一个字符
 *     替换一个字符
 **/
public class Num072_minDistance {
    public static int minDistance(String word1, String word2) {
        char[] str1 = word1.toCharArray();
        char[] str2 = word2.toCharArray();
        int len1 = str1.length;
        int len2 = str2.length;
        //dp[i][j]表示以下标为i-1的字符串word1，和以下标为j-1的字符串word2。最小的转换操作。
        int[][] dp = new int[len1 + 1][len2 + 1];
        for (int i = 0; i <= len1; i++) dp[i][0] = i;
        for (int j = 0; j <= len2; j++) dp[0][j] = j;
        //if (word1[i - 1] == word2[j - 1])
        //    不操作
        //if (word1[i - 1] != word2[j - 1])
        //    增 / 删 / 换
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (str1[i - 1] == str2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    //由于word2添加一个元素，相当于word1删除一个元素，就没有讨论增加元素
//                   dp[i][j] = dp[i - 1][j] + 1;  删去str1[i - 1]
//                   dp[i][j] = dp[i][j - 1] + 1;  删去str2[j - 1]
//                   dp[i][j] = dp[i - 1][j - 1] + 1; 替换,将str1[i - 1]换成str2[j-1]
                    // 三个去最小值，
                    dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
                }
            }
        }
        return dp[len1][len2];
    }

    public static void main(String[] args) {
        String s = "horse";
        String t = "ros";
        int distance = minDistance(s, t);
        System.out.println(distance);

    }
}
